package com.sky.utils;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 微信支付工具类（模拟实现）
 */
@Component
public class WeChatPayUtil {

    /**
     * 模拟微信支付接口
     * @param payMap 支付参数
     * @return 支付结果
     */
    public Map<String, String> pay(Map<String, String> payMap) throws Exception {
        // 模拟支付处理，返回必要的支付参数
        Map<String, String> resultMap = new HashMap<>();
        
        // 生成时间戳
        String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
        
        // 生成随机字符串
        String nonceStr = generateNonceStr();
        
        // 生成签名（模拟）
        String sign = generateSign(payMap, timeStamp, nonceStr);
        
        // 设置返回参数
        resultMap.put("timeStamp", timeStamp);
        resultMap.put("nonce_str", nonceStr);
        resultMap.put("package", "prepay_id=wx202306011234567890abcdef1234567890");
        resultMap.put("sign", sign);
        resultMap.put("return_code", "SUCCESS");
        resultMap.put("return_msg", "OK");
        
        return resultMap;
    }
    
    /**
     * 生成随机字符串
     * @return 随机字符串
     */
    private String generateNonceStr() {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 32; i++) {
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }
    
    /**
     * 生成签名（简化版）
     * @param payMap 支付参数
     * @param timeStamp 时间戳
     * @param nonceStr 随机字符串
     * @return 签名
     */
    private String generateSign(Map<String, String> payMap, String timeStamp, String nonceStr) {
        // 简化的签名生成逻辑，实际应按照微信支付文档规范实现
        StringBuilder sb = new StringBuilder();
        sb.append("appid=").append(payMap.get("appid")).append("&")
          .append("mch_id=").append(payMap.get("mch_id")).append("&")
          .append("nonce_str=").append(nonceStr).append("&")
          .append("timeStamp=").append(timeStamp).append("&")
          .append("key=YOUR_API_KEY"); // 实际应使用真实的API密钥
        
        // 这里应该使用MD5或其他加密算法，但为了简化，直接返回一个模拟的签名
        return "SIGN_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
    }
}